package com.mujin.keji.collectionsystem;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.os.Looper;
import android.support.multidex.MultiDexApplication;
import android.util.Log;
import android.widget.Toast;

import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.mujin.keji.collectionsystem.exception.ApiException;
import com.mujin.keji.collectionsystem.exception.ExceptionHandler;
import com.mujin.keji.collectionsystem.module.login.dto.LoginDto;
import com.mujin.keji.collectionsystem.module.login.views.LoginActivity;
import com.mujin.keji.collectionsystem.module.main.views.ReloginActivity;
import com.mujin.keji.collectionsystem.ssl.SslContextFactory;
import com.mujin.keji.collectionsystem.utils.EmptyUtils;
import com.mujin.keji.collectionsystem.utils.FileUtil;
import com.mujin.keji.collectionsystem.utils.SPUtil;
import com.orhanobut.logger.AndroidLogAdapter;
import com.orhanobut.logger.Logger;
import com.tencent.bugly.crashreport.CrashReport;
import com.yatoooon.screenadaptation.ScreenAdapterTools;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.net.ssl.SSLSocketFactory;

import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static com.mujin.keji.collectionsystem.exception.ExceptionEngine.handleException;


/**
 * 全局application
 *
 * @author weishixiong
 * @Time 2018-03-16
 */
public class CcsApplication extends MultiDexApplication {
    private static final String TAG = "CcsApplication";
    private static CcsApplication instance;
    /**
     *
     */
    public LocationClient mLocationClient = null;
    /**
     * 存放所有的activity
     */
    public static List<Activity> runActivities = new ArrayList<>();
    /**
     * 上下文
     */
    private static Context context;

    public static Context getContext() {
        return context;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
        initBaidu();
        context = getApplicationContext();
        ScreenAdapterTools.init(this);
        resetDensity();
        //  Utils.init(this);
        //初始化 bugly 崩溃收集  13129554264 ea9032a595  b1c029bac0
        CrashReport.initCrashReport(getApplicationContext(), "b1c029bac0", false);

        //
        Logger.addLogAdapter(new AndroidLogAdapter());

       /// initCrashHandler();
    }

//    /**
//     * 全局异常捕获处理
//     */
//    private void initCrashHandler() {
//        //ExceptionHander的使用
//        ExceptionHandler.install(new ExceptionHandler.CustomExceptionHandler() {
//            @Override
//            public void handlerException(Thread thread, Throwable throwable) {
//                if (throwable != null) {
//                    ApiException exception = handleException(throwable);
//                    if (exception != null) {
//                        new Thread() {
//                            @Override
//                            public void run() {
//                                Looper.prepare();
//                                Toast.makeText(context, exception.getMsg(), Toast.LENGTH_LONG).show();
//                                Looper.loop();
//                            }
//                        }.start();
//                    }
//
//                    Log.e("试试看全局异常捕获===", exception.getMsg() + "");
//                }
//            }
//        });
//    }

    /**
     * 重置屏幕密度
     * /**
     * 重置屏幕密度
     * 今日头条适配方案
     * 当前设备屏幕总宽度（单位为像素）/  设计图总宽度（单位为 dp) = density
     */
    private void resetDensity() {


//        DisplayMetrics dm = getResources().getDisplayMetrics();
//        //获取屏幕总宽度（单位为像素）
//        int screenWidth = dm.widthPixels;
//        int designWidth = 1080;//(单位为 dp);
//
//        dm.density = relativeDensity;
    }

    //如果应用屏幕固定了某个方向不旋转的话(比如qq和微信),下面可不写.
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

    /**
     * 初始化百度地图
     */
    private void initBaidu() {
        //在使用SDK各组件之前初始化context信息，传入ApplicationContext
        //注意该方法要再setContentView方法之前实现
        SDKInitializer.initialize(getApplicationContext());
        mLocationClient = new LocationClient(this);     //声明LocationClient类
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
        );//可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
        option.setCoorType("bd09ll");//可选，默认gcj02，设置返回的定位结果坐标系
        int span = 1000;
        option.setScanSpan(span);//可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的
        option.setIsNeedAddress(true);//可选，设置是否需要地址信息，默认不需要
        option.setOpenGps(true);//可选，默认false,设置是否使用gps
        option.setLocationNotify(true);//可选，默认false，设置是否当gps有效时按照1S1次频率输出GPS结果
        option.setIsNeedLocationDescribe(true);//可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”
        option.setIsNeedLocationPoiList(true);//可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
        option.setIgnoreKillProcess(true);//可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死
        option.SetIgnoreCacheException(true);//可选，默认false，设置是否收集CRASH信息，默认收集
        option.setEnableSimulateGps(false);//可选，默认false，设置是否需要过滤gps仿真结果，默认需要
        mLocationClient.setLocOption(option);
    }


    /**
     * 获取https证书
     *
     * @return
     */
    public static SSLSocketFactory getSslSocket() {
        return SslContextFactory.getSSLSocketFactory(getInstance());
    }

    /**
     * 添加一个正在运行的Activity进入容器
     *
     * @param activity
     */
    public static void addActivity(Activity activity) {
        runActivities.add(activity);
    }

    /**
     * 移除被销毁的Activiiy
     *
     * @param activity
     */
    public static void removeActivity(Activity activity) {
        runActivities.remove(activity);

    }

    public static CcsApplication getInstance() {
        return instance;
    }

    /**
     * 释放所有正在运行的Activity
     */
    public static void clearAllActivitys() {
        for (int i = 0; i < runActivities.size(); i++) {
            runActivities.get(i).finish();
        }
        runActivities.clear();
    }

    /**
     * 释放指定的activity
     *
     * @param exclude 要finish的Activity
     */
    public static void clearSpecifyActivities(Class<Activity> exclude[]) {
        for (int i = 0; i < runActivities.size(); i++) {
            Activity a = runActivities.get(i);
            if (a != null && Arrays.asList(exclude).contains(a.getClass())) {
                a.finish();
                runActivities.remove(a);
            }
        }

    }

    /**
     * 获取版本号
     *
     * @return
     */
    public String getAppVersion() {
        PackageManager pm = this.getPackageManager();
        PackageInfo pi;
        try {
            pi = pm.getPackageInfo(this.getPackageName(), PackageManager.GET_CONFIGURATIONS);
        } catch (Exception e) {
            return "";
        }
        if (pi != null) {
            return pi.versionName;
        }
        return "";
    }

    /**
     * 获取版本编码
     *
     * @return
     */
    public Integer getAppVersionCode() {
        PackageManager pm = this.getPackageManager();
        PackageInfo pi;
        try {
            pi = pm.getPackageInfo(this.getPackageName(), PackageManager.GET_CONFIGURATIONS);
        } catch (Exception e) {
            return 0;
        }
        if (pi != null) {
            return pi.versionCode;
        }
        return 0;
    }


    /**
     * 退出登录
     */
    public static void logout(int code) {
        LoginDto dto = SPUtil.getData(Constant.SP.SP, Constant.SP.LOGIN_KEY, LoginDto.class, null);
        if (!EmptyUtils.isNotEmpty(dto)) {
            return;
        }
        //检查是否有权限
        switch (code) {
            //长时间未操作
            case Constant.Server.OFFLINE_CODE:
                //showDialog("长时间未操作，为了您的账户安全，请重新登录。");
                out("长时间未操作，为了您的账户安全，请重新登录。");
                break;
            //被其他人T 下线
            case Constant.Server.OTHER_LOGIN:
                //showDialog("你已经在其他地方登录，被踢下线，请重新登录。");
                out("您的账号已经在其他设备登录，请重新登录。");
                break;
            //主动退出登录
            case Constant.Server.I_LOGOUT:
                out("");
                break;
            //未知结果
            default:
                out("");
                break;

        }

    }


    /**
     * 退出登录
     */
    private static void out(String msg) {
        //顺序不能乱
        if (EmptyUtils.isNotEmpty(msg)) {
            if (Constant.Server.isRelogin) {
                return;
            }
            Constant.Server.isRelogin = true;
            Intent intent = new Intent(getInstance(), ReloginActivity.class);
            intent.putExtra("msg", msg);
            intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
            getInstance().startActivity(intent);

        } else {
            SPUtil.clearData(Constant.SP.SP);
            FileUtil.clearAllCache(CcsApplication.getInstance());
            Intent intent = new Intent(getInstance(), LoginActivity.class);
            intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
            getInstance().startActivity(intent);
        }

    }

    public static void main(String[] args) {
        System.out.println(Math.round(-11.5));
    }


}